package com.itheima.service;
import cn.itheima.health.service.UserService;
import com.itheima.pojo.Permission;
import com.itheima.pojo.Role;
import com.itheima.pojo.User;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@Component("userService")
//   自定义一个  MyUserServiceImpl  继承 UserDetailsService
public class MyUserServiceImpl implements UserDetailsService {

    @Reference
    private UserService userService;  //数据库用户表


    @Override   //  这里 传入一个 String username 的参数  就是 用户的账号  然后到数据库中查询用户的信息
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        //Redis 优化    子啊redis 中存放 用户 角色 和授权 以及 用户信息的

        //  GrantedAuthority : 授予权限
           // 创建一个list 集合  里面添加 GrantedAuthority 属性  用于给数据授予权限
       List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
      User user=  userService.findUsersAndAuthoritiesByUsernam(username);
        System.out.println(user);
        //此时 就是 通过用户账号 找密码 然后进行判断
         if (user==null){
             return  null;  //找不到 就是认证失败
         }
         //  getRoles: 获得角色
        Set<Role> roles = user.getRoles();
         // 如果 从数据库中查询的用户 获得的角色 不等于空 或者 存在数据
        if (roles!=null && roles.size()!=0){
            // 就遍历 rolse
            for (Role role : roles) {
                //  创建一个 权限的方法    SimpleGrantedAuthority： 简单的权限    getKeyword： 获取权限
                SimpleGrantedAuthority simple_role = new SimpleGrantedAuthority(role.getKeyword());
                // 添加角色：   一边循环 一边将角色添加到  集合中 便于后面的 return
                grantedAuthorities.add(simple_role);
                 // 每一个角色 都有对应的 权限信息    getPermissions: 获取权限
                Set<Permission> permissions = role.getPermissions();
                    //获取权限信息
                    if (permissions!=null&& permissions.size()!=0){
                        //遍历每一个权限
                        for (Permission permission : permissions) {
                            //  创建一个 权限的方法    SimpleGrantedAuthority： 简单的权限    getKeyword： 获取权限
                            SimpleGrantedAuthority simple_permission = new SimpleGrantedAuthority(permission.getKeyword());
                            // 授予权限 ：  给每一个 查询到的角色 授予权限
                            grantedAuthorities.add(simple_permission);
                        }
                    }
            }
        }
        //         创建一个User 对象  这对象 不是实体类的User 是spring的 User
        System.out.println(user);

        return new org.springframework.security.core.userdetails.User
                //     里面传入了3个参数        grantedAuthorities ： 表示 上面代码 封装的 角色 和  授权的 集合
                (user.getUsername(),user.getPassword(),grantedAuthorities);
    }


}
